package com.itheima.test21;

import java.io.File;
import java.util.*;

public class test02 {
    public static void main(String[] args) {
        /*
           需求：假设【D】盘下有一个【学习资料】文件夹，统计该路径下文件的类型有多少个！
                    要求：
                    1. 键盘录入要统计的路径，判断录入的路径是否存在并且是否是一个文件夹，
                    2. 如果该路径有子目录，也要统计该子目录下的文件类型的个数，
                    3. 将文件的类型和对应的个数，存储到Map集合中，
                    4. 使用两种方式遍历Map集合，输出的格式如下：
                        jpg类型文件的个数是:74个
        */
        File dir = getDir();  //获取录入的文件夹路径
        List list = new ArrayList(); //创建一个存文件后缀的list集合
        List overlist = getFileExtension(dir, list); //拿到返回的list(存有所有的文件后缀)

        bl(overlist);//遍历overlist，获取各个文件后缀的个数
    }

    private static List getFileExtension(File dir, List list) {
        File[] f = dir.listFiles();
        for (File file : f) {
            if (file.isFile()) {//如果是文件就统计各种后缀名的文件的个数(使用LinkedHashMap)
                String str = file.getName().substring(file.getName().lastIndexOf(".") + 1);
                list.add(str);
            } else {//如果是文件夹就继续调用printFile()函数
                getFileExtension(file, list);
            }
        }
        return list;
    }

    private static void bl(List list) {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();   //准备用于统计与存储的容器，双列集合、用于统计对应关系
        for (int i = 0; i < list.size(); i++) {
            if (map.containsKey(list.get(i))) {
                int count = map.get(list.get(i));  //遍历map集合，拼接字符串成要求格式
                count += 1;
                map.put((String) list.get(i), count);
            } else {//如果集合中没有当前字符，说明以前没有统计过，说明是第一次
                map.put((String) list.get(i), 1);
            }
        }
        blMap(map);    //遍历map集合，拼接字符串成要求格式
    }

    private static void blMap(LinkedHashMap<String, Integer> map) {
        for (Map.Entry<String, Integer> en : map.entrySet()) {
            String s = en.getKey();
            int count = en.getValue();
            System.out.println(s+"类型文件的个数是:"+count+"个 ");
        }
    }

    private static File getDir() { //从键盘录入一个文件夹路径，并判断是否是文件夹
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入要统计的文件夹的路径：");
            String str = sc.nextLine();
            File f = new File(str);
            if (f.isDirectory()) {
                return f;
            } else {
                System.out.println("输入的路径不合法");
            }
        }
    }
}
